package com.gitee.l0km.jsonvisitor.fastjson;

import java.util.Stack;


import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;

import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONToken;
import com.gitee.l0km.jsonvisitor.exception.ParseException;

import static com.gitee.l0km.jsonvisitor.fastjson.Fastjsons.createJSONLexer;

public class FastjsonPairMatcher0 {

	/**
	 * 跳过当前值对
	 * @param lexer
	 * @param stack
	 */
	private static void skipPair(JSONLexer lexer, Stack<Integer> stack) {
		int t;
		while (true) {
			lexer.nextToken();
			if ((t = lexer.token()) == JSONToken.EOF) {
				if(!stack.isEmpty()) {
					throw new ParseException("UNEXPECT EOF");
				}
				break;
			}
			// log("{}",JSONToken.name(t));
			if (stack.isEmpty()) {
				if (t == JSONToken.COMMA || t == JSONToken.RBRACE) {
					return;
				}
			}
			switch (t) {
			case JSONToken.LBRACE:
			case JSONToken.LBRACKET:
				stack.push(t);
				break;
			case JSONToken.RBRACE:
				checkState(stack.pop() == JSONToken.LBRACE, "MISMATCH TOKEN,%s REUIRED",
						JSONToken.name(JSONToken.LBRACE));
				break;
			case JSONToken.RBRACKET:
				checkState(stack.pop() == JSONToken.LBRACKET, "MISMATCH TOKEN,%s REUIRED",
						JSONToken.name(JSONToken.LBRACKET));
				break;
			default:
				break;
			}
		}
	}

	public static String matchPair(Object src) {
		JSONLexer lexer = createJSONLexer(src);
		lexer.nextToken();
		int t = lexer.token();
		if (JSONToken.LBRACE == t) {
			while(true)  {
				lexer.nextToken();
				t = lexer.token();
				if(t == JSONToken.EOF || t ==JSONToken.RBRACE) {
					break;
				}
				//				log("{}",JSONToken.name(t));
				int key = t;
				checkArgument(key == JSONToken.LITERAL_STRING, "INVALID token,%s REQUIRED",
						JSONToken.name(JSONToken.LITERAL_STRING));
				String keystr = lexer.stringVal();
				if(keystr.equals("tokenId")) {
					lexer.nextTokenWithColon();
					int value = lexer.token();
					checkArgument(value != JSONToken.EOF, "UNEXPECT EOF");
					if(value == JSONToken.LITERAL_STRING) {
						return lexer.stringVal();
					}
				}else {
					skipPair(lexer,new Stack<Integer>());
				}
			}
		}
		return null;
	}

}

